package com.shujia.ml

import org.apache.spark.ml.classification.{LogisticRegression, LogisticRegressionModel}
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}

object Demo3Person {
  def main(args: Array[String]): Unit = {

    val spark: SparkSession = SparkSession
      .builder()
      .master("local")
      .appName("point")
      .getOrCreate()
    import spark.implicits._


    /**
     * 1、特征工程
     */
    //读取svm格式ide数据
    //spark 会自动识别libsvm格式数据，自动获取目标值和特征向量
    val personDF: DataFrame = spark
      .read
      .format("libsvm") //指定读取数据的格式
      .load("spark/data/人体指标.txt")

    personDF.show(false)

    personDF.groupBy("label").count().show()

    //将数据切分成训练集和测试集
    val Array(train, test) = personDF.randomSplit(Array(0.8, 0.2))

    /**
     * 2、选择算法
     */

    val regression = new LogisticRegression()

    /**
     * 3、将训练集带入算法训练模型
     */
    val model: LogisticRegressionModel = regression.fit(train)

    println(model.intercept)
    println(model.coefficientMatrix)

    /**
     * 4、使用测试集评估模型
     */
    val frame: DataFrame = model.transform(test)
    frame.show(100, false)

    //计算准确率
    val p: Double = frame.where($"label" === $"prediction").count().toDouble / frame.count()

    println(p)

    /**
     * 5、将模型保存到hdfs中
     */
    model.save("spark/data/person_model")
  }
}
